﻿using System.Collections.Generic;
using Wedn.Core.Common;
using Wedn.Core.Entity;

namespace Wedn.Core.Service
{
    /// <summary>
    /// 元数据管理类
    /// </summary>
    public class MetaManager
    {
        private Wedn.Interface.DAL.IMeta dao;
        /// <summary>
        /// 链接管理类构造函数
        /// </summary>
        /// <exception cref="未找到系统数据库访问组件"></exception>
        public MetaManager()
        {
            dao = Wedn.Interface.DAOFactory.CreateMetaDAOInstance();
            if (dao == null)
            {
                throw new System.Exception("缺失数据库访问组件!");
            }
        }

        /// <summary>
        /// 向拓展元数据表中插入一行新数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="meta">要插入的对象</param>
        /// <returns>执行结果受影响行数</returns>
        public int Insert(Meta meta)
        {
            return dao.Insert(meta);
        }

        /// <summary>
        /// 根据元数据ID删除对应的元数据记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除记录的元数据ID</param>
        /// <returns>执行结果受影响行数</returns>
        public int Delete(int id)
        {
            return dao.Delete(id);
        }

        /// <summary>
        /// 根据元数据ID数组批量删除对应的元数据记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除记录的ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        public int Delete(int[] ids)
        {
            return dao.Delete(ids);
        }

        /// <summary>
        /// 根据关系对象ID和类型删除对应的元数据记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="objectId">关系对象ID</param>
        /// <param name="objectType">关系对象类型</param>
        /// <param name="key">属性名称(省略该参数传入null, 默认删除全部属性)</param>
        /// <returns>执行结果受影响行数</returns>
        public int Delete(int objectId, ObjectType objectType, string key)
        {
            return dao.Delete(objectId, (int)objectType, key);
        }

        /// <summary>
        /// 更新一个完整的拓展元数据对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="meta">要更新的对象</param>
        /// <returns>执行结果受影响行数</returns>
        public int UpdateMeta(Meta meta)
        {
            return dao.UpdateMeta(meta);
        }

        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        public int GetMaxId()
        {
            return dao.SelectMaxId();
        }

        /// <summary>
        /// 检查表中对应的关系对象是否已经存在该属性名称, 返回一个布尔值, 存在则为True; 不存在则为False
        /// </summary>
        /// <param name="objectId">关联对象ID</param>
        /// <param name="objectType">关联对象类型</param>
        /// <param name="key">要确定的属性名称</param>
        /// <returns>存在返回True; 不存在返回False</returns>
        public bool ExistsKey(int objectId, ObjectType objectType, string key)
        {
            return dao.Exists(objectId, (int)objectType, key);
        }

        /// <summary>
        /// 取出当前拓展元数据表中的所有拓展元数据信息对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <returns>所有拓展元数据信息对象集合</returns>
        public List<Meta> GetMetaList()
        {
            List<Meta> list = dao.SelectMetaList();
            if (list == null)
                list = new List<Meta>();
            return list;
        }

        /// <summary>
        /// 根据指定关联对象类型取出当前拓展元数据表中的所有拓展元数据信息对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <param name="objectType">关联对象类型</param>
        /// <returns>管理对象类型的所有拓展元数据信息对象集合</returns>
        public List<Meta> GetMetaList(ObjectType objectType)
        {
            List<Meta> list = dao.SelectMetaList((int)objectType);
            if (list == null)
                list = new List<Meta>();
            return list;
        }

        /// <summary>
        /// 根据关系对象ID和关系对象类型取出当前类别下拓展元数据表中的所有拓展元数据信息对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <param name="objectId">关联对象ID</param>
        /// <param name="objectType">关联对象类型(post|user|link...)</param>
        /// <returns>指定对象的所有拓展元数据信息对象集合</returns>
        public List<Meta> GetMetaList(int objectId, ObjectType objectType)
        {
            List<Meta> list = dao.SelectMetaList(objectId, (int)objectType);
            if (list == null)
                list = new List<Meta>();
            return list;
        }

        /// <summary>
        /// 根据ID取出当前拓展元数据表中的拓展元数据对象, 不存在则返回null
        /// </summary>
        /// <param name="id">元数据ID</param>
        /// <returns>拓展元数据对象</returns>
        public Meta GetMeta(int id)
        {
            return dao.SelectMeta(id);
        }

        /// <summary>
        /// 根据关联对象ID, 类型, 键取出当前拓展元数据表中的对应的选项值, 不存在则返回null
        /// </summary>
        /// <param name="objectId">关联对象ID</param>
        /// <param name="objectType">关联对象类型</param>
        /// <param name="key">属性键</param>
        /// <returns>对应的选项值</returns>
        public string GetValue(int objectId, ObjectType objectType, string key)
        {
            return dao.SelectValue(objectId, (int)objectType, key);
        }
    }
}
